/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.cliente.descubridor.vista;

import co.com.client.BaseView.CreateBase;
import co.com.cliente.Services;
import co.com.cliente.asteroide.estuctura.AsteroideDS;
import co.com.cliente.asteroide.estuctura.AsteroideRecord;
import co.com.cliente.usuario.estructura.UsuarioDS;
import co.com.cliente.usuario.estructura.UsuarioRecord;
import co.com.cliente.usuario.vista.AsignarUsuario;
import co.com.entities.Asteroide;
import co.com.entities.Descubridor;
import co.com.entities.DescubridorPK;
import co.com.entities.Usuario;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DataSource;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Button;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author ias
 */
public class CreacionDescubridor extends CreateBase{
    
    private HLayout accionesDescubridor;
    private DynamicForm frmDescubridores;
    private Button btnGuardar, btnLimpiar, btnAgregarUsuario;
    private SelectItem cbxAsteroide;
    private ListGrid usuariosGrid;
    private AsteroideDS asteroideDS;
    
    public CreacionDescubridor(){
        
        super("Crear descubrimiento", "100%");
        
        asteroideDS = new AsteroideDS();
        
        btnGuardar = new Button("Guardar");

        btnLimpiar = new Button("Limpiar");
        
        btnAgregarUsuario = new Button("Agregar usuario");
        
        cbxAsteroide = new SelectItem();
        cbxAsteroide.setTitle("Asteroide");
        cbxAsteroide.setName("cbxAsteroide");
        cbxAsteroide.setRequired(true);
        cbxAsteroide.setWidth(200);
        cbxAsteroide.setDisplayField(AsteroideDS.NOMBRE);
        cbxAsteroide.setValueField(AsteroideDS.IDASTEROIDE);
        cbxAsteroide.setAlign(Alignment.LEFT);
        cbxAsteroide.setWrapTitle(false);

        accionesDescubridor = new HLayout();
        accionesDescubridor.setMargin(20);
        accionesDescubridor.setMembersMargin(20);
        accionesDescubridor.setHeight(50);
        accionesDescubridor.setWidth("100%");
        accionesDescubridor.setAlign(Alignment.CENTER);
        accionesDescubridor.setMembers(btnAgregarUsuario, btnGuardar, btnLimpiar);
        
        frmDescubridores = new DynamicForm();
        frmDescubridores.setNumCols(4);
        frmDescubridores.setItems(cbxAsteroide);
        
        usuariosGrid = new ListGrid();
        usuariosGrid.setWidth100();
        usuariosGrid.setHeight100();
        usuariosGrid.setDataSource(new UsuarioDS());
        usuariosGrid.setAutoFetchData(true);
        usuariosGrid.setFields(UsuarioRecord.getFieldsDescubridor());
        usuariosGrid.setEmptyMessage("No hay registros para mostrar");
        usuariosGrid.setSelectionType(SelectionStyle.SIMPLE);
        usuariosGrid.setFilterOnKeypress(true);
        usuariosGrid.setShowFilterEditor(true);
        usuariosGrid.setCanRemoveRecords(true);
        
        VLayout contenedor = new VLayout();
        contenedor.setMembers(frmDescubridores, usuariosGrid);
        
        btnAgregarUsuario.addClickHandler(new ClickHandler() {

            public void onClick(ClickEvent event) {
                AsignarUsuario asignarUsuario = new AsignarUsuario(usuariosGrid);
            }
        });        
        
        btnGuardar.addClickHandler(new ClickHandler() {

            public void onClick(ClickEvent event) {
                List<Descubridor> descubridores = getDescubridores();
                if(!descubridores.isEmpty()){
                    Services.getDescubridoresServices().guardarDescubrimiento(descubridores, new AsyncCallback<Void>() {

                        public void onFailure(Throwable caught) {
                            SC.say("El descubrimiento no pudo ser registrado");
                            destroy();
                        }

                        public void onSuccess(Void result) {
                            SC.say("El descubrimiento fue registrado correctamente");
                            destroy();
                        }
                    });
                }
            }
        });
        AddActionBarItem(accionesDescubridor);
        AddFormContainerItem(contenedor);
        cargarAsteroides();
    }
    
    
    
    public void cargarAsteroides() {
        Services.getAsteroideServices().consultarAsteroides(new AsyncCallback<List<Asteroide>>() {

            public void onFailure(Throwable caught) {
                       Logger.getLogger(getClass().getName()).log(Level.INFO, "Mensaje informativo...no se cargaron los cargos de empleados: " + caught.getMessage());
            }

            public void onSuccess(List<Asteroide> result) {
                for (int i = 0; i < result.size(); i++) {
                    asteroideDS.addData(new AsteroideRecord(result.get(i)));
                }
                cbxAsteroide.setOptionDataSource(asteroideDS);
            }
        });
    }
    
    private void clearResults() {
        DataSource ds = usuariosGrid.getDataSource();
        for (ListGridRecord record : usuariosGrid.getRecords()) {
            ds.removeData(record);
        }
    }
    
    public List<Descubridor> getDescubridores(){
        if(!frmDescubridores.validate() && usuariosGrid.getRecords().length <= 0){
            SC.say("Señor usuario debe seleccionar un asteroide y al menos asignar un usuario");
            return null;
        }
        else{
            Asteroide asteroide = cbxAsteroide.getSelectedRecord().getAttributeAsObject("asteroideData") == null ? null : (Asteroide) cbxAsteroide.getSelectedRecord().getAttributeAsObject("asteroideData");
            List<Descubridor> descubridores = new ArrayList<Descubridor>();
            if(asteroide !=null){
                for (ListGridRecord record : usuariosGrid.getRecords()) {
                    Usuario usuario = record.getAttributeAsObject("Usuario")==null?null:(Usuario)record.getAttributeAsObject("Usuario");
                    if(usuario!=null){
                        Descubridor descubridor = new Descubridor();
                        DescubridorPK pk = new DescubridorPK();
                        pk.setDsidUsuario(usuario.getNmdocumento());
                        pk.setFefechaDescubrimiento(new Date());
                        pk.setNmidAsteroide(asteroide.getNmidAsteroide().toBigInteger());
                        descubridor.setUsuario(usuario);
                        descubridor.setAsteroide(asteroide);
                        descubridor.setDescubridorPK(pk);
                        descubridores.add(descubridor);
                    }
                }
            }
            return descubridores;
        }
    }
}
